//@version=5
indicator("B-Xtrender By Neal inspired from @Puppytherapy", overlay=true, max_bars_back=500)

// Inputs
short_l1 = input.int(2, title="Short - L1")
short_l2 = input.int(20, title="Short - L2")
short_l3 = input.int(2, title="Short - L3")

long_l1 = input.int(20, title="Long - L1")
long_l2 = input.int(2, title="Long - L2")

// BX Trender Calculations
shortTermXtrender = ta.rsi(ta.ema(close, short_l1) - ta.ema(close, short_l2), short_l3) - 50
longTermXtrender = ta.rsi(ta.ema(close, long_l1), long_l2) - 50

// Smoothed Short-Term Xtrender
t3(src, length) =>
    b = 0.7
    c1 = -b * b * b
    c2 = 3 * b * b + 3 * b * b * b
    c3 = -6 * b * b - 3 * b - 3 * b * b * b
    c4 = 1 + 3 * b + b * b * b + 3 * b * b
    ema1 = ta.ema(src, length)
    ema2 = ta.ema(ema1, length)
    ema3 = ta.ema(ema2, length)
    ema4 = ta.ema(ema3, length)
    ema5 = ta.ema(ema4, length)
    ema6 = ta.ema(ema5, length)
    c1 * ema6 + c2 * ema5 + c3 * ema4 + c4 * ema3

maShortTermXtrender = t3(shortTermXtrender, 5)

// Color Logic for T3 Smoother Line
colShortTermXtrender = maShortTermXtrender > maShortTermXtrender[1] ? color.lime : color.red

// New Entry Condition (Based on Color Change)
longCondition = colShortTermXtrender == color.lime and colShortTermXtrender[1] == color.red  // Color changes from red to green
shortCondition = colShortTermXtrender == color.red and colShortTermXtrender[1] == color.lime  // Color changes from green to red

// Alerts
alertcondition(longCondition, title="Buy Signal", message="Buy Signal Detected")
alertcondition(shortCondition, title="Sell Signal", message="Sell Signal Detected")

// Trade Tracking
var float[] entryPrices = array.new_float(0)
var label[] tradeLabels = array.new_label(0)
var int maxTrades = 5

if (longCondition)
    entryPrice = open
    label longLabel = label.new(bar_index, low, "Entry, long " + str.tostring(entryPrice), style=label.style_label_up, color=color.green, textcolor=color.white, size=size.normal, yloc=yloc.belowbar)
    array.unshift(entryPrices, entryPrice)
    array.unshift(tradeLabels, longLabel)

if (shortCondition and array.size(entryPrices) > 0)
    entryPrice = array.shift(entryPrices)
    pnl = ((low - entryPrice) / entryPrice) * 100
    pnlText = pnl > 0 ? "+" + str.tostring(pnl, "#.##") + "%" : str.tostring(pnl, "#.##") + "%"
    label exitLabel = label.new(bar_index, high, "Exit " + pnlText, style=label.style_label_down, color=color.red, textcolor=color.white, size=size.normal, yloc=yloc.abovebar)
    array.unshift(tradeLabels, exitLabel)

if (array.size(tradeLabels) > maxTrades)
    label oldestLabel = array.pop(tradeLabels)
    label.delete(oldestLabel)

// Updated BX-Trender Oscillator Visualization
bxColor = maShortTermXtrender > 0 ? (maShortTermXtrender > maShortTermXtrender[1] ? color.green : color.new(color.green, 60)) : 
          (maShortTermXtrender < maShortTermXtrender[1] ? color.red : color.new(color.red, 60))

plot(maShortTermXtrender, color=bxColor, style=plot.style_columns, linewidth=2, title="BX-Trender Oscillator")
